module features.vs_buildtools_installer;
public import feature;
import commons;

enum BuildToolsVersion = "17";

private Feature vsBuildToolsInstaller;
/**
```d
bool (ref Terminal t, ref RealTimeConsoleInput input, string usage, const string[] features
```
*/
Task!(installFromVSBuildToolsImpl) installFromVSBuildTools;

private bool installFromVSBuildToolsImpl(Feature*[] dependencies, ref Terminal t, ref RealTimeConsoleInput input, string usage, const string[] features)
{
    import std.algorithm;
    t.writeln("Installing the following features with Microsoft Visual Studio Build Tools for '", usage, "'");
    foreach(f; features)
        t.writeln("\t", f);
    return t.wait(spawnShell(configs["vsBuildTools"].str~ " --passive --wait --norestart "
		~ features.reduce!((str, last) => "--add "~last~" "~str))
	) != 0;
}

bool installVSBuildTools(ref Terminal t, ref RealTimeConsoleInput input, TargetVersion ver, Download[] downloadsRequired)
{
	configs["vsBuildTools"] = downloadsRequired[0].getOutputPath();
	return true;
}

void initialize()
{
	vsBuildToolsInstaller  = Feature(
		name: "Visual Studio Build Tools Installer",
		description: "Gets the official Visual Studio Build Tools so it is possible to build to microsoft targets",
		ExistenceChecker(["vsBuildTools"]),
		Installation([Download(
			DownloadURL(
                windows: "https://aka.ms/vs/$VERSION/release/vs_BuildTools.exe"
            ),
			"$CWD/buildtools/vs_BuildTools".executableExtension
		)], toDelegate(&installVSBuildTools)),
        currentVersion: TargetVersion.parse(BuildToolsVersion)
	);
}

void start()
{
	installFromVSBuildTools = Task!(installFromVSBuildToolsImpl)([&vsBuildToolsInstaller]);
}